import CryptoJS from 'crypto-js'
import { useUserStore } from '@/store/modules/user'
const userStore = useUserStore()
const httpUrl = new URL('wss://spark-api.xf-yun.com/v3.5/chat')
let modelDomain: string
const APPID = '8793205c'
const API_SECRET = 'ZTg0YzA4NWQ0NTdmZTQ4OWU4NzE2MmY3'
const API_KEY = '0c280daf27236673a559d37dfcdf9a42'

export default function chat() {
  function getWebsocketUrl() {
    // 动态获取domain信息
    switch (httpUrl.pathname) {
      case '/v1.1/chat':
        modelDomain = 'general'
        break
      case '/v2.1/chat':
        modelDomain = 'generalv2'
        break
      case '/v3.1/chat':
        modelDomain = 'generalv3'
        break
      case '/v3.5/chat':
        modelDomain = 'generalv3.5'
        break
    }

    return new Promise((resolve, reject) => {
      const apiKey = API_KEY
      const apiSecret = API_SECRET

      let url = 'wss://' + httpUrl.host + httpUrl.pathname

      const host = location.host //本地主机端口
      const date = new Date().toGMTString()
      const algorithm = 'hmac-sha256' //算法
      const headers = 'host date request-line'
      const signatureOrigin = `host: ${host}\ndate: ${date}\nGET ${httpUrl.pathname} HTTP/1.1`
      const signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret)
      const signature = CryptoJS.enc.Base64.stringify(signatureSha)
      const authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`
      const authorization = btoa(authorizationOrigin)
      url = `${url}?authorization=${authorization}&date=${date}&host=${host}`
      resolve(url)
    })
  }

  class TTSRecorder {
    appId
    status
    onWillStatusChange: any
    ttsWS: any
    playTimeout: any
    constructor({ appId = APPID } = {}) {
      this.appId = appId
      this.status = 'init'
    }

    // 修改状态
    setStatus(status: any) {
      this.onWillStatusChange && this.onWillStatusChange(this.status, status)
      this.status = status
    }

    // 连接websocket
    connectWebSocket() {
      this.setStatus('ttsing')
      return getWebsocketUrl().then((url) => {
        let ttsWS
        if ('WebSocket' in window) {
          ttsWS = new WebSocket(url as string)
        } else if ('MozWebSocket' in window) {
          ttsWS = new MozWebSocket(url);
        } else {
          alert('浏览器不支持WebSocket')
          return
        }
        this.ttsWS = ttsWS
        ttsWS.onopen = () => {
          this.webSocketSend()
        }
        ttsWS.onmessage = (e) => {
          this.result(e.data)
        }
        ttsWS.onerror = () => {
          clearTimeout(this.playTimeout)
          this.setStatus('error')
          alert('WebSocket报错，请f12查看详情')
          console.error(`详情查看：${encodeURI(url.replace('wss:', 'https:'))}`)
        }
        ttsWS.onclose = () => {
          console.log("传输完毕");
          userStore.ttsWS = 'close'
        }
      })
    }

    // websocket发送数据
    webSocketSend() {
      console.log(text.value)
      const stream = {
        "header": {
          "app_id": APPID,
          "uid": "1234"
        },
        "parameter": {
          "chat": {
            "domain": modelDomain,
            "random_threshold": 0.5,
            "max_tokens": 2048,
            "auditing": "default"
          }
        },
        "payload": {
          "message": {
            "text": [
              { "role": "user", "content": text.value }
            ]
          }
        }
      }

      const params = {
        "header": {
          "app_id": APPID,
          "uid": "1234"
        },
        "parameter": {
          "chat": {
            "domain": modelDomain,
            "random_threshold": 0.5,
            "max_tokens": 2048,
            "auditing": "default"
          }
        },
        "payload": {
          "message": {
            "text": [
              { "role": "user", "content": text.value }
            ]
          },
          "functions": {
            "text": [
              {
                name: '简历分析建议',
                description:
                  '对简历进行分析',//根据简历上提供 的基本信息、优势亮点、专业技能、项目经验、教育背景等，依次分析一下有哪些问题，有问题如何改善？注意按这几个主题分条列点哈
                parameters: {
                  type: 'object',
                  properties: {
                    "基本信息": {
                      type: 'object',
                      description:
                        '分析一下基本信息部分，将基本信息中出现的"问题"和"建议"列出来，放在数组当中，例如：[{"问题":"****","建议":"******"}]'
                    },
                    "优势亮点": {
                      type: 'object',
                      description: '将优势亮点中出现的问题和建议列出来，放在数组当中，例如：[{"问题":"****","建议":"******"}]'
                    },
                    "专业技能": {
                      type: 'object',
                      description: '将专业技能中出现的问题和建议列出来，放在数组当中，例如：[{"问题":"****","建议":"******"}]'
                    },
                    "项目经验": {
                      type: 'object',
                      description: '将项目经验中出现的问题和建议列出来，放在数组当中，例如：[{"问题":"****","建议":"******"}]'
                    },
                    "教育背景": {
                      type: 'object',
                      description: '将教育背景中出现的问题和建议列出来，放在数组当中，例如：[{"问题":"****","建议":"******"}]'
                    },
                    score: {
                      type: 'number',
                      description: "结合简历上面的东西，给我这份简历信息打个0-100的分数"
                    }
                  },
                  required: ['基本信息', '优势亮点', '专业技能', '项目经验', '教育背景', 'score']
                }
              }

            ]
          }
        }
      }
      // console.log(JSON.stringify(params), "描述参数")
      // 对text.value进行判断
      if (text.value.includes("🍇")) {
        this.ttsWS.send(JSON.stringify(stream))
      } else {
        this.ttsWS.send(JSON.stringify(params))
      }

    }

    start() {
      showRes.value = '' // 请空回答历史
      this.connectWebSocket()
    }

    // websocket接收数据的处理
    result(resultData: string) {
      const jsonData = JSON.parse(resultData)
      console.log(jsonData)
      // 这里进行文字处理一下
     
      if (!text.value.includes("🍇")) {
        console.log(JSON.parse(jsonData.payload.choices.text[0].function_call.arguments))
        const data = JSON.parse(jsonData.payload.choices.text[0].function_call.arguments)
        if (data) {
          userStore.resumeResult = data
          console.log(data)
        }
      }


      if (text.value.includes("🍇")) {
         console.log(jsonData.payload.choices.text[0].content);
        //这里进行文字处理一下
        const reg = /\n/g
        const str = jsonData.payload.choices.text[0].content.replace(reg, '<br><br>')

        showRes.value = showRes.value + str // 追加回答历史
        // // 提问失败
        if (jsonData.header.code !== 0) {
          alert(`提问失败: ${jsonData.header.code}:${jsonData.header.message}`)
          console.error(`${jsonData.header.code}:${jsonData.header.message}`)
          return
        }
        if (jsonData.header.code === 0 && jsonData.header.status === 2) {
          this.ttsWS.close()
          bigModel.setStatus('init')
        }
      }

    }
  }

  //开始调用
  const bigModel = new TTSRecorder()

  const showRes = ref('') //展示结果的
  const text = ref(``)//AI分析文本
  function send() {
    bigModel.start()
  }

  return {
    showRes,
    text, //文本输入框
    send
  }
}




/* 
 functions: {
            text: [
              {
                name: '简历检测建议',
                description:
                  '根据简历上提供 的基本信息、优势亮点、专业技能、项目经验、教育背景等，依次分析一下有哪些问题，有问题如何改善？注意按这几个主题分条列点哈',
                parameters: {
                  type: 'object',
                  properties: {
                    基本信息: {
                      type: 'array',
                      description:
                        '分析一下基本信息部分，将基本信息中出现的“问题”和“建议”列出来，放在数组当中，数组中是对象'
                    },
                    优势亮点: {
                      type: 'array',
                      description: '将优势亮点中出现的问题和建议列出来，放在数组当中，数组中是对象'
                    },
                    专业技能: {
                      type: 'array',
                      description: '将专业技能中出现的问题和建议列出来，放在数组当中，数组中是对象'
                    },
                    项目经验: {
                      type: 'array',
                      description: '将项目经验中出现的问题和建议列出来，放在数组当中，数组中是对象'
                    },
                    教育背景: {
                      type: 'array',
                      description: '将教育背景中出现的问题和建议列出来，放在数组当中，数组中是对象'
                    },
                    score: {
                      type: 'number',
                      description: "结合上面的东西，给我这份简历打个0-100大概的分数"
                    }
                  },
                  required: ['基本信息', '优势亮点', '专业技能', '项目经验', '教育背景', 'score']
                }
              }
            ]
          }
*/




/* 曾伟豪的表述
     score: {
                      type: 'number',
                      description: `
                                            1. 教育背景 (总分10分)
● 学历水平 (4分): 引入国际学历评估标准，如QS世界大学排名或国家教育部认证，确保对不同教育背景的公平评价。
● 专业相关性 (3分): 结合行业需求分析和职位描述，使用自然语言处理技术来识别求职者专业与职位的相关性。
● 学术成绩 (3分): 引入学术成就的量化指标，如发表的论文、参与的研究项目，以及学术奖项，来评估学术表现。
2. 工作经验 (总分20分)
● 相关工作经验 (10分): 使用机器学习算法分析求职者的工作历史，识别与职位相关的经验，并评估其在职业生涯中的成长轨迹。
● 职位匹配度 (5分): 利用文本分析技术，将求职者的工作描述与职位要求进行匹配，评估其工作经验与职位的契合度。
● 职责与成就 (5分): 通过成就的量化指标，如完成的项目数量、管理的团队规模、达成的业绩目标，来评估求职者的工作成就。
3. 技能与证书 (总分15分)
● 专业技能 (8分): 根据市场需求和职位要求，使用数据挖掘技术来评估求职者技能的市场价值和相关性。
● 技能证书 (4分): 引入行业认证数据库，评估求职者持有的证书的权威性和时效性。
● 技术工具熟练度 (3分): 结合求职者在实际项目中使用技术工具的证据，评估其熟练程度。
4. 项目经验 (总分20分)
● 项目相关性 (10分): 通过项目描述的语义分析，评估项目内容与职位要求的相关性。
● 项目影响力 (5分): 引入社会网络分析，评估项目在行业内的影响力和认可度。
● 项目角色与贡献 (5分): 使用自然语言处理技术，从项目描述中提取求职者的角色和贡献，评估其在项目中的重要性。
5. 个人能力 (总分15分)
● 问题解决能力 (5分): 结合心理学研究，通过求职者提供的案例分析，评估其解决问题的策略和效果。
● 团队合作与领导力 (5分): 利用社交网络分析，评估求职者在团队中的互动和领导行为。
● 创新与学习能力 (5分): 通过求职者的学习历程和创新成果，评估其适应变化和持续学习的能力。
6. 语言与沟通 (总分10分)
● 专业语言能力 (5分): 结合多语言能力评估工具，评估求职者在专业领域的语言沟通能力。
● 沟通与表达 (5分): 通过求职者的写作样本和面试表现，评估其沟通技巧和表达能力。
7. 自我评价与职业规划 (总分10分)
● 自我认识 (5分): 结合职业兴趣和个性测试，评估求职者的自我认识和职业定位。
● 职业目标清晰度 (5分): 通过求职者的职业规划陈述，评估其目标的明确性和实现可能性。
8. 附加项 (总分5分)
● 荣誉与奖项 (2分): 引入外部数据库，评估求职者获得的荣誉和奖项的行业影响力。
● 社会活动与志愿服务 (2分): 结合社会责任感评估，评估求职者的社会贡献和公民参与。
● 个人兴趣与特长 (1分): 通过兴趣和特长的相关性分析，评估其对职位的正面影响。
通过这些优化措施，AI评分模型将更加精准地评估求职者的综合能力，同时确保评分过程的科学性和客观性。这些改进将有助于提高招聘效率，同时为求职者提供更公正的评价。给予一份0至100的分数评级，该评分应反映求职者在简历中体现出的整体能力和市场竞争力。 请根据以上指引，对上传的个人简历进行全面诊断，并提供详细的分析报告及优化建议。 
                                            
                                            `
                    }
*/